package com.ming.learn.from.carl.binary.tree;

import com.ming.commons.utils.TreeNode;
import com.sun.jmx.remote.internal.ArrayQueue;

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

public class Of20210305LeetCode102 {
    /*
    给你一个二叉树，请你返回其按 层序遍历 得到的节点值。（即逐层地，从左到右访问所有节点）。
     */

    public static void main(String[] args) {
        System.out.println(levelOrder(new TreeNode(1, new TreeNode(2, new TreeNode(4)
                , new TreeNode(5)), new TreeNode(3, new TreeNode(6), new TreeNode(7)))));
    }

    /*
    队列先进先出，符合一层一层遍历的逻辑，而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
     */
    private static List<List<Integer>> levelOrder(TreeNode root) {
        ArrayQueue<TreeNode> que = new ArrayQueue<>(10);
        ArrayList<List<Integer>> result = new ArrayList<>();
        if (root != null) que.add(root);
        while (!que.isEmpty()) {
            int size = que.size();
            ArrayList<Integer> vec = new ArrayList<>();
            // 这里一定要使用固定大小size，不要使用que.size()，因为que.size是不断变化的
            for (int i = 0; i < size; i++) {
                TreeNode node = que.remove(0);
                vec.add(node.val);
                if (node.left != null) que.add(node.left);
                if (node.right != null) que.add(node.right);
            }
            result.add(vec);
        }
        return result;
    }
}
